Skip to content

Pulse: a gym and studio full-stack sample - #6145

Merged
shai-almog merged 26 commits into
masterfrom
pulse-studio-sample
Nov 1, 2026
Merged

shai-almog merged 26 commits into
masterfrom
pulse-studio-sample

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Pulse is a full-stack sample for a gym or studio: one app with four roles (member, trainer, front desk, owner) on a Codename One backend. It shows the health and fitness APIs inside an app a real studio could run.

What it covers

  • Members: a rotating QR door pass plus NFC fob, booking and waitlists, households with children, away periods, friends with kudos and invites, workouts from Health with heart-rate zones, points, badges and a watch face.
  • Trainers: the week's classes, rosters, marked attendance, a live class view with members' heart-rate zones, shift swaps.
  • Front desk and kiosk: scan or tap to check in, refusals with a reason, walk-ins, today's numbers.
  • Owner: recurring revenue, utilisation, members at risk, takings, ranked popular classes, quiet classes with a button to fill them, plans, timetable, staff and campaigns.
  • Backend: recurring billing with a dunning ladder and freezes on a simulated processor, rotating signed check-in tokens, engagement and campaign jobs, push.
  • Also: an Initializr template, CI workflow, user's and implementor's guides with screenshots, and a website page.

Also in this PR

  • CSS compiler: CSSTheme.isModified recursed forever on a derive cycle (X.pressed { cn1-derive: X; }, or two styles deriving from each other). It hit StackOverflowError, and only on an incremental build. Fixed with a visited set; CSSDeriveCycleCacheTest fails on the old code and passes now.

Verified locally

  • Backend tests: 57/0/0 on SQLite; all 10 test classes pass on PostgreSQL and on MySQL (scripts/ci/sample-server-tests-on-database.sh).
  • e2e: 5/5 in the simulator, headless in a container.
  • css-compiler: 391/0/0.
  • Template check passes.
  • Every screen was reviewed by an adversarial red team, three UI rounds and one code round, until it gave the go-ahead.

🤖 Generated with Claude Code

shai-almog and others added 15 commits October 30, 2026 16:47
…ing, engagement

Phases 1-3 of the Pulse gym/studio sample: shared model, backend with
households and age bands, class booking with waitlist promotion, rotating
QR/NFC door passes, walk-ins, trainers and shifts, subscription billing with
proration, freezes and a dunning ladder, away periods, fill-a-class and
miss-you nudges, social feed and invites, owner dashboard and campaigns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PostgreSQL refused 'metric' in the VARCHAR(4) units column; SQLite took it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The server scores visits, streaks and worn sensors (a strap or watch earns a
bonus) into levels and badges. Home leads with the next class on an ink card,
a level ring, month tiles, the badge shelf and a strap callout; the timetable
shows classes as cards with a colour stripe, capacity meter and inline action.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s with zones and points

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…demo class

The trainer's home leads with the class on now, its live view shows each
attendee's zone, the desk shows today's classes and who came in, and the
owner's timetable, templates and staff read as cards. The watch shows the
next class, the door code with a countdown, and points and streak, and no
longer makes its labels before the display exists. The dev server seeds a
class under way with simulated heart rates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, sweep transaction, e2e fixes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…isting

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
isModified() followed derives without remembering the path, so a state
deriving from its own style (X.pressed { cn1-derive: X; }) or two styles
deriving from each other recursed until StackOverflowError -- only on a
rebuild, since a first build has no checksum cache to compare with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… polish

Backend: the demo studio's zone is configurable (pulse.demo.zone) and every
day is the studio's, not UTC's (the desk's day, the class list's start);
real names, walk-ins at the desk, friends and profiles for the seeded
members, ten guests.

Client: front desk scan/fob tiles, pass copy and fob row, owner stat tiles
with grouped money and a ranked popular-classes list, timetable day and
person pills, workouts and feed lines that no longer wrap, the beat line,
a labelled visits chart, the header clear of the notch on every screen.
Screenshots and guide text follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

…-safe Monday

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@shai-almog

shai-almog commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 231 screenshots: 231 matched.
✅ JavaScript-port screenshot tests passed.

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ compose-compat: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

shai-almog and others added 6 commits October 31, 2026 14:06
… prose

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ur-page watch

Owner: Insights (retention, busy-hours heatmap, membership over twelve weeks,
class fill and no-shows, plan mix, coach ranking), a searchable member list with
each member's history, and billing with failed charges. Trainer: the month's
classes, check-ins, fill, attendance, regulars and kudos. Watch: next class, door
code, week and the classes coming up. A larger seeded history feeds the charts.
The user's guide and the website page show every screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nguageTool

The Android build refuses the workout token: no record class backs it, so the
permission could never be used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…custom icon

The owner gets Accounts: search, staff/flagged/blocked filters, roles,
household, history, flag and block. The trainer gets points, levels,
streak, rank, coach badges and a leaderboard, shifts with actions on the
row, and a fifth watch page while coaching. Sign-out clears the watch.
Owner shifts with no location show every site. The members search no
longer touches the filter pills. Sheet's close button has an accessible
name. The e2e harness walks the component tree on the EDT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s; guide prose

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 195 screenshots: 195 matched.

Native Android coverage

  • 📊 Line coverage: 19.19% (56042/292047 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.15% (270042/1488151), branch 12.40% (19638/158314), complexity 10.37% (15815/152567), method 15.72% (11380/72383), class 27.89% (2236/8017)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.19% (56042/292047 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.15% (270042/1488151), branch 12.40% (19638/158314), complexity 10.37% (15815/152567), method 15.72% (11380/72383), class 27.89% (2236/8017)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 181ms / native 116ms = 1.5x speedup
SIMD float-mul (64K x300) java 104ms / native 106ms = 0.9x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 108.000 ms
Base64 CN1 decode 86.000 ms
Base64 native encode 663.000 ms
Base64 encode ratio (CN1/native) 0.163x (83.7% faster)
Base64 native decode 384.000 ms
Base64 decode ratio (CN1/native) 0.224x (77.6% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 44ms / native 4ms = 11.0x speedup
SIMD float-mul (64K x300) java 44ms / native 3ms = 14.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 61.000 ms
Base64 CN1 decode 71.000 ms
Base64 SIMD encode 80.000 ms
Base64 encode ratio (SIMD/CN1) 1.311x (31.1% slower)
Base64 SIMD decode 79.000 ms
Base64 decode ratio (SIMD/CN1) 1.113x (11.3% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 6.000 ms
Image createMask ratio (SIMD on/off) 0.667x (33.3% faster)
Image applyMask (SIMD off) 36.000 ms
Image applyMask (SIMD on) 30.000 ms
Image applyMask ratio (SIMD on/off) 0.833x (16.7% faster)
Image modifyAlpha (SIMD off) 33.000 ms
Image modifyAlpha (SIMD on) 22.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.667x (33.3% faster)
Image modifyAlpha removeColor (SIMD off) 36.000 ms
Image modifyAlpha removeColor (SIMD on) 20.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.556x (44.4% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: Intel64 Family 6 Model 207 Stepping 2, GenuineIntel (baseline windows-x64@intel64-family-6-model-207-genuineintel)

1 improvement past the baseline (not a failure; rebaseline to lock it in):

  • recursion on all 4 CPUs: time 0.95x against a 1.20x baseline (-21.1%, tolerance 20%)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.24x (base 1.07x, +16.2%) 0.66x (base 0.86x, -23.4%) ok
translator (self) 4 0.74x (base 0.79x, -5.9%) 0.51x (base 0.53x, -2.4%) ok
intArithmetic 4 1.02x (base 1.02x, -0.1%) 0.06x (base 0.06x, -2.8%) ok
longArithmetic 4 0.97x (base 0.97x, -0.3%) 0.06x (base 0.05x, +3.4%) ok
mathTranscendental 4 0.89x (base 0.89x, +0.5%) 0.06x (base 0.06x, +2.5%) ok
arraySequential 4 1.51x (base 1.98x, -23.8%) 0.38x (base 0.38x, +0.3%) ok
arrayRandom 4 1.01x (base 1.01x, -0.0%) 0.23x (base 0.23x, +0.7%) ok
objectAllocation 4 0.88x (base 1.22x, -27.3%) 0.33x (base 0.37x, -11.5%) ok
valueEscape 4 0.13x (base 0.13x, +2.3%) 0.05x (base 0.04x, +4.7%) ok
hashMapChurn 4 1.02x (base 1.14x, -10.9%) 0.10x (base 0.10x, +3.8%) ok
stringBuilding 4 1.48x (base 1.42x, +4.9%) 0.24x (base 0.22x, +5.4%) ok
recursion 4 0.95x (base 1.20x, -21.1%) 0.06x (base 0.06x, +3.3%) improved: rebaseline to lock in (time -21.1%)
quicksort 4 1.04x (base 1.07x, -2.9%) 0.12x (base 0.12x, +1.5%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/6145.json, with the reason, from this job's perf-results.json. The rebaseline is then part of this pull request's diff:

python3 vm/selfhost/calibrate-perf-baseline.py --pr 6145 --reason "<why these benchmarks moved>" perf-results.json

Result: no regression (improved past the baseline: consider rebaselining)

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD float-mul (64K x300) java 49ms / native 3ms = 16.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 61.000 ms
Base64 CN1 decode 70.000 ms
Base64 SIMD encode 73.000 ms
Base64 encode ratio (SIMD/CN1) 1.197x (19.7% slower)
Base64 SIMD decode 74.000 ms
Base64 decode ratio (SIMD/CN1) 1.057x (5.7% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 17.000 ms
Image applyMask (SIMD on) 15.000 ms
Image applyMask ratio (SIMD on/off) 0.882x (11.8% faster)
Image modifyAlpha (SIMD off) 15.000 ms
Image modifyAlpha (SIMD on) 7.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.467x (53.3% faster)
Image modifyAlpha removeColor (SIMD off) 17.000 ms
Image modifyAlpha removeColor (SIMD on) 11.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.647x (35.3% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.04x (base 1.11x, -6.4%) 0.72x (base 0.75x, -4.5%) ok
translator (self) 4 0.88x (base 0.84x, +4.6%) 0.49x (base 0.51x, -2.7%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.06x (base 0.06x, +3.3%) ok
longArithmetic 4 0.79x (base 0.80x, -0.3%) 0.06x (base 0.06x, +3.8%) ok
mathTranscendental 4 0.72x (base 0.72x, -0.4%) 0.07x (base 0.06x, +2.0%) ok
arraySequential 4 0.35x (base 0.46x, -22.6%) 0.39x (base 0.39x, +0.1%) ok
arrayRandom 4 0.94x (base 0.94x, +0.4%) 0.23x (base 0.23x, +0.3%) ok
objectAllocation 4 1.71x (base 1.82x, -6.0%) 0.30x (base 0.43x, -30.8%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, +3.0%) ok
hashMapChurn 4 0.97x (base 0.98x, -1.1%) 0.12x (base 0.12x, -0.1%) ok
stringBuilding 4 1.52x (base 1.43x, +6.8%) 0.27x (base 0.27x, -0.1%) ok
recursion 4 1.42x (base 1.46x, -2.9%) 0.07x (base 0.07x, +1.5%) ok
quicksort 4 1.00x (base 1.00x, +0.1%) 0.12x (base 0.12x, +0.7%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 196 screenshots: 196 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 630 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 53ms / native 7ms = 7.5x speedup
SIMD float-mul (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 45.000 ms
Base64 CN1 decode 53.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 11.000 ms
Image createMask (SIMD on) 7.000 ms
Image createMask ratio (SIMD on/off) 0.636x (36.4% faster)
Image applyMask (SIMD off) 65.000 ms
Image applyMask (SIMD on) 62.000 ms
Image applyMask ratio (SIMD on/off) 0.954x (4.6% faster)
Image modifyAlpha (SIMD off) 60.000 ms
Image modifyAlpha (SIMD on) 53.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.883x (11.7% faster)
Image modifyAlpha removeColor (SIMD off) 73.000 ms
Image modifyAlpha removeColor (SIMD on) 59.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.808x (19.2% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.87x (base 0.96x, -9.4%) 0.84x (base 0.93x, -9.6%) ok
translator (self) 3 0.66x (base 0.62x, +5.2%) 0.75x (base 0.78x, -3.8%) ok
intArithmetic 3 1.04x (base 1.03x, +0.8%) 0.12x (base 0.12x, +0.8%) ok
longArithmetic 3 1.05x (base 1.03x, +2.1%) 0.11x (base 0.07x, +60.2%) ok
mathTranscendental 3 1.01x (base 1.01x, +0.6%) 0.12x (base 0.12x, +0.0%) ok
arraySequential 3 0.45x (base 0.42x, +7.9%) 0.53x (base 0.53x, +0.5%) ok
arrayRandom 3 0.98x (base 0.99x, -1.2%) 0.33x (base 0.32x, +0.4%) ok
objectAllocation 3 1.08x (base 1.11x, -2.6%) 0.83x (base 0.72x, +14.5%) ok
valueEscape 3 0.51x (base 0.51x, +0.2%) 0.09x (base 0.09x, -0.0%) ok
hashMapChurn 3 1.10x (base 1.18x, -6.4%) 0.07x (base 0.07x, +10.9%) ok
stringBuilding 3 0.93x (base 0.84x, +10.8%) 0.46x (base 0.46x, -0.4%) ok
recursion 3 1.23x (base 1.24x, -0.2%) 0.12x (base 0.12x, +1.3%) ok
quicksort 3 0.99x (base 1.01x, -2.2%) 0.11x (base 0.11x, +1.1%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 9V45 96-Core Processor (baseline linux-x64@amd-epyc-9v45-96-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 1.06x (base 0.92x, +15.6%) 0.81x (base 0.84x, -3.5%) ok
translator (self) 4 0.59x (base 0.64x, -7.4%) 0.59x (base 0.55x, +7.5%) ok
intArithmetic 4 0.99x (base 1.00x, -0.8%) 0.04x (base 0.06x, -30.9%) ok
longArithmetic 4 0.96x (base 0.99x, -3.7%) 0.04x (base 0.07x, -46.9%) ok
mathTranscendental 4 1.20x (base 1.20x, -0.3%) 0.04x (base 0.06x, -28.2%) ok
arraySequential 4 2.87x (base 2.91x, -1.1%) 0.36x (base 0.36x, +0.9%) ok
arrayRandom 4 1.00x (base 1.04x, -3.5%) 0.20x (base 0.23x, -11.0%) ok
objectAllocation 4 1.57x (base 1.61x, -2.5%) 0.28x (base 0.24x, +19.2%) ok
valueEscape 4 0.10x (base 0.12x, -15.5%) 0.03x (base 0.04x, -22.3%) ok
hashMapChurn 4 1.38x (base 1.31x, +5.7%) 0.09x (base 0.09x, +7.1%) ok
stringBuilding 4 1.53x (base 1.58x, -2.8%) 0.26x (base 0.22x, +20.2%) ok
recursion 4 1.31x (base 1.34x, -2.0%) 0.04x (base 0.08x, -47.5%) ok
quicksort 4 1.06x (base 1.06x, +0.3%) 0.10x (base 0.11x, -10.7%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.97x (base 1.02x, -5.2%) 0.75x (base 0.66x, +13.4%) ok
translator (self) 4 0.75x (base 0.70x, +8.1%) 0.44x (base 0.43x, +2.9%) ok
intArithmetic 4 1.05x (base 1.04x, +0.1%) 0.03x (base 0.03x, +4.3%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, +4.7%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.4%) ok
arraySequential 4 0.35x (base 0.36x, -2.6%) 0.37x (base 0.37x, +0.1%) ok
arrayRandom 4 0.95x (base 0.94x, +1.3%) 0.20x (base 0.20x, +0.6%) ok
objectAllocation 4 1.96x (base 1.77x, +11.1%) 0.41x (base 0.37x, +9.8%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +6.3%) ok
hashMapChurn 4 0.86x (base 0.84x, +1.9%) 0.12x (base 0.12x, -3.3%) ok
stringBuilding 4 1.50x (base 1.57x, -4.5%) 0.26x (base 0.26x, -0.1%) ok
recursion 4 1.55x (base 1.43x, +8.0%) 0.04x (base 0.04x, +3.3%) ok
quicksort 4 0.99x (base 0.99x, -0.0%) 0.09x (base 0.09x, +1.2%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 192 screenshots: 192 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 756 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 87ms / native 15ms = 5.8x speedup
SIMD float-mul (64K x300) java 48ms / native 3ms = 16.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 54.000 ms
Base64 native encode 650.000 ms
Base64 encode ratio (CN1/native) 0.092x (90.8% faster)
Base64 native decode 342.000 ms
Base64 decode ratio (CN1/native) 0.158x (84.2% faster)
Base64 SIMD encode 55.000 ms
Base64 encode ratio (SIMD/CN1) 0.917x (8.3% faster)
Base64 SIMD decode 56.000 ms
Base64 decode ratio (SIMD/CN1) 1.037x (3.7% slower)
Base64 encode ratio (SIMD/native) 0.085x (91.5% faster)
Base64 decode ratio (SIMD/native) 0.164x (83.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 10.000 ms
Image createMask (SIMD on) 7.000 ms
Image createMask ratio (SIMD on/off) 0.700x (30.0% faster)
Image applyMask (SIMD off) 48.000 ms
Image applyMask (SIMD on) 38.000 ms
Image applyMask ratio (SIMD on/off) 0.792x (20.8% faster)
Image modifyAlpha (SIMD off) 41.000 ms
Image modifyAlpha (SIMD on) 40.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.976x (2.4% faster)
Image modifyAlpha removeColor (SIMD off) 55.000 ms
Image modifyAlpha removeColor (SIMD on) 42.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.764x (23.6% faster)

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Apple TV (tvOS / Metal)

Compared 188 screenshots: 171 matched, 13 updated, 4 missing references.

  • AnimateHierarchyScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    AnimateHierarchyScreenshotTest
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 1344x756.
    Full-resolution PNG saved as AnimateHierarchyScreenshotTest.png in workflow artifacts.

  • AnimateLayoutScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    AnimateLayoutScreenshotTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 1344x756.
    Full-resolution PNG saved as AnimateLayoutScreenshotTest.png in workflow artifacts.

  • AnimateUnlayoutScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    AnimateUnlayoutScreenshotTest
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 1344x756.
    Full-resolution PNG saved as AnimateUnlayoutScreenshotTest.png in workflow artifacts.

  • KmpCompatLayout — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-tv/KmpCompatLayout.png.

    KmpCompatLayout
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 1920x1080.
    Full-resolution PNG saved as KmpCompatLayout.png in workflow artifacts.

  • KmpCompatList — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-tv/KmpCompatList.png.

    KmpCompatList
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 1920x1080.
    Full-resolution PNG saved as KmpCompatList.png in workflow artifacts.

  • KmpCompatState — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-tv/KmpCompatState.png.

    KmpCompatState
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 1920x1080.
    Full-resolution PNG saved as KmpCompatState.png in workflow artifacts.

  • KmpCompatTypography — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-tv/KmpCompatTypography.png.

    KmpCompatTypography
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 1920x1080.
    Full-resolution PNG saved as KmpCompatTypography.png in workflow artifacts.

  • MorphTransitionScrolledSourceTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    MorphTransitionScrolledSourceTest
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 1344x756.
    Full-resolution PNG saved as MorphTransitionScrolledSourceTest.png in workflow artifacts.

  • PullToRefreshSpinnerScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    PullToRefreshSpinnerScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 1920x1080.
    Full-resolution PNG saved as PullToRefreshSpinnerScreenshotTest.png in workflow artifacts.

  • SheetSlideUpAnimationScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    SheetSlideUpAnimationScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 1920x1080.
    Full-resolution PNG saved as SheetSlideUpAnimationScreenshotTest.png in workflow artifacts.

  • SmoothScrollScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    SmoothScrollScreenshotTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 1344x756.
    Full-resolution PNG saved as SmoothScrollScreenshotTest.png in workflow artifacts.

  • StatusBarTapDiagnosticScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    StatusBarTapDiagnosticScreenshotTest
    Preview info: JPEG preview quality 60; JPEG preview quality 60; downscaled to 1344x756.
    Full-resolution PNG saved as StatusBarTapDiagnosticScreenshotTest.png in workflow artifacts.

  • StickyHeaderFadeTransitionScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    StickyHeaderFadeTransitionScreenshotTest
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 1344x756.
    Full-resolution PNG saved as StickyHeaderFadeTransitionScreenshotTest.png in workflow artifacts.

  • StickyHeaderScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    StickyHeaderScreenshotTest
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 1344x756.
    Full-resolution PNG saved as StickyHeaderScreenshotTest.png in workflow artifacts.

  • StickyHeaderSlideTransitionScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    StickyHeaderSlideTransitionScreenshotTest
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 1344x756.
    Full-resolution PNG saved as StickyHeaderSlideTransitionScreenshotTest.png in workflow artifacts.

  • TabsAnimatedIndicatorScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    TabsAnimatedIndicatorScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 1920x1080.
    Full-resolution PNG saved as TabsAnimatedIndicatorScreenshotTest.png in workflow artifacts.

  • TensileBounceScreenshotTest — updated screenshot. Screenshot differs (3840x2160 px, bit depth 8).

    TensileBounceScreenshotTest
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 1344x756.
    Full-resolution PNG saved as TensileBounceScreenshotTest.png in workflow artifacts.

…cons centred in their circles

A lone icon in a round label was pushed off centre by the label's text gap,
which CN1 counts even with no text. Wide windows dock the menu, spread the
owner dashboards into two columns and open members and accounts beside the
list. Accounts with a profile but no sign-in open instead of 404ing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Apple Watch (watchOS / Core Graphics)

Compared 253 screenshots: 247 matched, 2 updated, 4 missing references.

  • KmpCompatLayout — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatLayout.png.

    KmpCompatLayout
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatLayout.png in workflow artifacts.

  • KmpCompatList — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatList.png.

    KmpCompatList
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatList.png in workflow artifacts.

  • KmpCompatState — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatState.png.

    KmpCompatState
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatState.png in workflow artifacts.

  • KmpCompatTypography — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatTypography.png.

    KmpCompatTypography
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatTypography.png in workflow artifacts.

  • Sheet — updated screenshot. Screenshot differs (416x496 px, bit depth 8).

    Sheet
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as Sheet.png in workflow artifacts.

  • TabsAnimatedIndicatorScreenshotTest — updated screenshot. Screenshot differs (208x248 px, bit depth 8).

    TabsAnimatedIndicatorScreenshotTest
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as TabsAnimatedIndicatorScreenshotTest.png in workflow artifacts.

shai-almog and others added 3 commits November 1, 2026 11:56
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog
shai-almog merged commit 35681d2 into master Nov 1, 2026
@shai-almog
shai-almog deleted the pulse-studio-sample branch November 1, 2026 17:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant